package bsr.basara.autodata.util;

import cn.hutool.core.util.RandomUtil;

import java.io.UnsupportedEncodingException;

/**
 * 中文字符工具
 */
public class ChineseCharUtils {

    /**
     * 通过unicode编码
     * 汉字的unicode范围是：0x4E00~0x9FA5
     *
     * @return
     */
    public static char genChineseChar() {
        return (char) (0x4e00 + RandomUtil.randomInt(0x9fa5 - 0x4e00 + 1));
    }

    /**
     * 通过区位码
     * 汉字以两个字节存储，称为 区位码 ，高位叫区码，低位叫位码，有这俩字节组成汉字。
     * 假设有一张汉字表，横竖都是 94列，那么区码就相当于行，位码就相当于列，根据行列就可以确定一个汉字了，
     * GB2312大致就是按照这种方式实现的，
     * 1～9区即前９行放的是特殊字符，
     * 16～55区放的是一级汉字，
     * 56～87区放的是二级汉字，其余的暂时空余。
     * 为了区别中文与西文字母，在中文字符首位以1开头区分以0开头的ASCII码，
     * GB2312给每个中文字符加上0xA0，因此，区码从0xB0-0xF7 都是汉字，位码范围0xA0-0xFE
     *
     * @return
     */
    public static char randomChineseChar() {
        String str = "";
        //区码，0xA0打头，,16~55一级汉字，56~87二级汉字
        int highPos = (176 + Math.abs(RandomUtil.randomInt(39)));
        //位码，0xA0打头，范围第1~94列
        int lowPos = 161 + Math.abs(RandomUtil.randomInt(93));
        byte[] b = new byte[2];
        b[0] = (new Integer(highPos)).byteValue();
        b[1] = (new Integer(lowPos)).byteValue();

        try {
            str = new String(b, "GB2312");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return str.charAt(0);
    }

    /**
     * 生成指定长度的中文字符
     *
     * @param length 字符长度
     * @return
     */
    public static String randomChineseChars(int length) {
        StringBuilder str = new StringBuilder();
        for (int i = length; i > 0; i--) {
            str.append(randomChineseChar());
        }
        return str.toString();
    }

    /**
     * 生成指定长度范围的中文字符
     *
     * @param min 最小个数
     * @param max 最大个数
     * @return
     */
    public static String randomChineseChars(int min, int max) {
        StringBuilder str = new StringBuilder();
        int length = RandomUtil.randomInt(min, max + 1);
        for (int i = 0; i < length; i++) {
            str.append(randomChineseChar());
        }
        return str.toString();
    }

    /**
     * 生成中文名字
     *
     * @param surname 姓
     * @param nv      性别 true女性 false 男性
     * @return
     */
    public static String getName(String surname, Boolean nv) {
        String[] firstName = "赵,钱,孙,李,周,吴,郑,王,冯,陈,褚,卫,蒋,沈,韩,杨,朱,秦,尤,许,何,吕,施,张,孔,曹,严,华,金,魏,陶,姜,戚,谢,邹,喻,柏,水,窦,章,云,苏,潘,葛,奚,范,彭,郎,鲁,韦,昌,马,苗,凤,花,方,俞,任,袁,柳,酆,鲍,史,唐,费,廉,岑,薛,雷,贺,倪,汤,滕,殷,罗,毕,郝,邬,安,常,乐,于,时,傅,皮,卞,齐,康,伍,余,元,卜,顾,孟,平,黄,和,穆,萧,尹,姚,邵,湛,汪,祁,毛,禹,狄,米,贝,明,臧,计,伏,成,戴,谈,宋,茅,庞,熊,纪,舒,屈,项,祝,董,梁,杜,阮,蓝,闵,席,季,麻,强,贾,路,娄,危,江,童,颜,郭,梅,盛,林,刁,钟,徐,邱,骆,高,夏,蔡,田,樊,胡,凌,霍,虞,万,支,柯,昝,管,卢,莫,经,房,裘,缪,干,解,应,宗,丁,宣,贲,邓,郁,单,杭,洪,包,诸,左,石,崔,吉,钮,龚,程,嵇,邢,滑,裴,陆,荣,翁,荀,羊,於,惠,甄,麴,家,封,芮,羿,储,靳,汲,邴,糜,松,井,段,富,巫,乌,焦,巴,弓,牧,隗,山,谷,车,侯,宓,蓬,全,郗,班,仰,秋,仲,伊,宫,宁,仇,栾,暴,甘,钭,厉,戎,祖,武,符,刘,景,詹,束,龙,叶,幸,司,韶,郜,黎,蓟,薄,印,宿,白,怀,蒲,邰,从,鄂,索,咸,籍,赖,卓,蔺,屠,蒙,池,乔,阴,郁,胥,能,苍,双,闻,莘,党,翟,谭,贡,劳,逄,姬,申,扶,堵,冉,宰,郦,雍,舄,璩,桑,桂,濮,牛,寿,通,边,扈,燕,冀,郏,浦,尚,农,温,别,庄,晏,柴,瞿,阎,充,慕,连,茹,习,宦,艾,鱼,容,向,古,易,慎,戈,廖,庾,终,暨,居,衡,步,都,耿,满,弘,匡,国,文,寇,广,禄,阙,东,殴,殳,沃,利,蔚,越,夔,隆,师,巩,厍,聂,晁,勾,敖,融,冷,訾,辛,阚,那,简,饶,空,曾,毋,沙,乜,养,鞠,须,丰,巢,关,蒯,相,查,後,荆,红,游,竺,权,逯,盖,益,桓,公,万俟,司马,上官,欧阳,夏侯,诸葛,闻人,东方,赫连,皇甫,尉迟,公羊,澹台,公冶,宗政,濮阳,淳于,单于,太叔,申屠,公孙,仲孙,轩辕,令狐,钟离,宇文,长孙,慕容,鲜于,闾丘,司徒,司空,亓官,司寇,仉,督,子车,颛孙,端木,巫马,公西,漆雕,乐正,壤驷,公良,拓跋,夹谷,宰父,谷梁,晋,楚,闫,法,汝,鄢,涂,钦,段干,百里,东郭,南门,呼延,归,海,羊舌,微生,岳,帅,缑,亢,况,后,有,琴,梁丘,左丘,东门,西门,商,牟,佘,佴,伯,赏,南宫,墨,哈,谯,笪,年,爱,阳,佟,第五,言,福".split(",");
        String girl = "秀娟英华慧巧美娜静淑惠珠翠雅芝玉萍红娥玲芬芳燕彩春菊兰凤洁梅琳素云莲真环雪荣爱妹霞香月莺媛艳瑞凡佳嘉琼勤珍贞莉桂娣叶璧璐娅琦晶妍茜秋珊莎锦黛青倩婷姣婉娴瑾颖露瑶怡婵雁蓓纨仪荷丹蓉眉君琴蕊薇菁梦岚苑婕馨瑗琰韵融园艺咏卿聪澜纯毓悦昭冰爽琬茗羽希宁欣飘育滢馥筠柔竹霭凝晓欢霄枫芸菲寒伊亚宜可姬舒影荔枝思丽";
        String boy = "伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮会思群豪心邦承乐绍功松善厚庆磊民友裕河哲江超浩亮政谦亨奇固之轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德行时泰盛雄琛钧冠策腾楠榕风航弘";

        String name = surname;
        if (surname == null || surname.length() < 1) {
            name = firstName[RandomUtil.randomInt(firstName.length)];
        }
        //性别
        if (nv == null) {
            nv = RandomUtil.randomBoolean();
        }
        if (nv) {
            name = name + girl.charAt(RandomUtil.randomInt(girl.length()));
            //两字和三字名
            boolean twoChar = RandomUtil.randomBoolean();
            if (!twoChar) {
                name = name + girl.charAt(RandomUtil.randomInt(girl.length()));
            }
        } else {
            name = name + boy.charAt(RandomUtil.randomInt(boy.length()));
            //两字和三字名
            boolean twoChar = RandomUtil.randomBoolean();
            if (!twoChar) {
                name = name + boy.charAt(RandomUtil.randomInt(boy.length()));
            }
        }
        return name;
    }


    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println(getName("天", null));
        }
    }
}
